package com.model.single;


/**
 * 单例模式练手·饿汉式 (static 修饰，类变量，随着类的加载而加载，故称之为饿汉式。)
 *
 * @author innocent
 * @date 2019/1/16 17:43
 */
public class Demo {
    //构造方法私有化
    private Demo() {

    }

    ;
    //自己创建一个实例
    private static Demo instance = new Demo();

    //对外提供公共的访问方法，来获取实例
    public static Demo getInstance() {
        return instance;
    }
}

/**
 * 单例模式·懒汉式(采用懒加载的方式，在类加载的时候，并不初始化，而在使用的时候，初始化)
 *
 * @author ABC
 * @time 2019/1/16 17:51
 */
class DemoLazy {
    //构造方法私有化
    private DemoLazy() {
    }

    //自己创建一个实例，但并不直接初始化
    private static DemoLazy demoLazy = null;

    //对外提供公共的访问方法
    /*public static DemoLazy getInstance() {
        if (demoLazy != null) {
            demoLazy = new DemoLazy();
        }
        return demoLazy;
    }*/

    //多线程环境下
    public synchronized static DemoLazy getInstance() {
        if (demoLazy != null) {
            demoLazy = new DemoLazy();
        }
        return demoLazy;
    }

    //提高效率
    public static DemoLazy getInstance2() {
        if (demoLazy != null) {

            synchronized (DemoLazy.class) {
                if (demoLazy != null) {
                    demoLazy = new DemoLazy();
                }
            }
        }
        return demoLazy;
    }

}
